fix: skip -march auto-detection for cross-compilation presets#21356
Merged
alexghr merged 1 commit intomerge-train/spartanfrom Mar 17, 2026
Merged
fix: skip -march auto-detection for cross-compilation presets#21356alexghr merged 1 commit intomerge-train/spartanfrom
alexghr merged 1 commit intomerge-train/spartanfrom
Conversation
689d65d to
4278757
Compare
4278757 to
c376ade
Compare
c376ade to
06b1d54
Compare
06b1d54 to
41a28fe
Compare
41a28fe to
423a8b0
Compare
423a8b0 to
c308c01
Compare
The arch.cmake auto-detection (added in #21611) defaults TARGET_ARCH to 'skylake' when ARM is not detected. For cross-compilation presets like arm64-ios, arm64-android, and arm64-ios-sim, CMAKE_SYSTEM_PROCESSOR is not set, so ARM detection fails and -march=skylake gets injected into aarch64 builds — causing zig to error with 'unknown CPU: skylake'. For arm64-macos, ARM is detected but -march=generic overrides zig's -mcpu=apple_a14, causing libdeflate build failures (missing AES target feature). Fix: gate auto-detection on NOT CMAKE_CROSSCOMPILING. Cross-compile toolchains (Zig) handle architecture targeting via their own flags. Presets that explicitly set TARGET_ARCH (amd64-linux, arm64-linux) are unaffected. Also restores native_build_dir variable that was dropped in the build infrastructure refactor.
c308c01 to
8f1c6d9
Compare
charlielye
approved these changes
Mar 17, 2026
ludamad
pushed a commit
that referenced
this pull request
Mar 17, 2026
# fix: ARM64 devcontainer builds — skip `-march` on ARM and use explicit zig aarch64 target ## Summary Fixes SIGILL (Illegal Instruction) crashes and build failures on ARM64 Mac (M3/Apple Silicon) devcontainers caused by incorrect `-march` handling introduced in #21611. ## Problem PR #21611 originally fixed ARM64 devcontainer builds by using explicit `aarch64-linux-gnu.2.35` zig targets. During the merge, that approach was replaced with cmake-based auto-detection that sets `TARGET_ARCH=generic` on ARM and passes `-march=generic` to the compiler. This caused two distinct failures: ### 1. SIGILL crashes (`Illegal instruction`) The zig compiler wrappers still used `-target native-linux-gnu.2.35`, which auto-detects the host CPU. On CI (AWS Graviton with SVE extensions), this produces binaries containing SVE instructions. These cached binaries are then downloaded on Apple Silicon devcontainers (ARM64 without SVE), causing SIGILL when executed — e.g. `honk_solidity_key_gen` crashing during `barretenberg/sol` bootstrap. The `-march=generic` flag was supposed to override this, but `-march=generic` is **not a valid value on aarch64**. It's an x86 concept. LLVM/zig silently ignored it, so the native CPU detection still produced SVE instructions. ### 2. Build failures (`unknown CPU: 'armv8'`) Even attempting `-march=armv8-a` (a valid GCC/Clang aarch64 value) fails because zig uses its own CPU naming scheme (e.g. `generic`, `cortex_a72`, `apple_m3`), not GCC-style architecture strings. Zig interprets `-march=armv8-a` as CPU name `armv8`, which doesn't exist → `error: unknown CPU: 'armv8'`. **Bottom line:** The `-march` cmake approach fundamentally doesn't work with zig on ARM. Zig has its own architecture targeting via `-target`, which is the correct mechanism. ## What this PR changes ### 1. `arch.cmake` — Skip `-march` auto-detection on ARM Removed the ARM branch from the auto-detection. On x86_64, we still auto-detect `TARGET_ARCH=skylake`. On ARM, we don't set `TARGET_ARCH` at all, so no `-march` flag is passed — the zig wrappers handle architecture targeting instead. ### 2. `zig-cc.sh` / `zig-c++.sh` — Explicit aarch64 target on ARM Linux Restored the original fix from #21611 that was dropped during merge. On ARM64 Linux, the wrappers now use `-target aarch64-linux-gnu.2.35` instead of `-target native-linux-gnu.2.35`. This produces generic ARM64 code without CPU-specific extensions (SVE, etc.), ensuring cached binaries work on all ARM64 machines — Graviton, Apple Silicon, Ampere, etc. x86_64 behavior is unchanged (still uses `-target native`). ## Context: what happened after #21611 After #21611 merged with the cmake auto-detection approach, it triggered a cascade of follow-up PRs trying to fix the fallout: | PR | Status | Issue | |----|--------|-------| | #21621 | Merged | Introduced the auto-detect approach (replaced zig wrapper fix with cmake `-march`) | | #21356 | Merged | Added `NOT CMAKE_CROSSCOMPILING` guard for cross-compile failures | | #21637 | Open | Attempting to fix cross-compiles + restore `native_build_dir` | | #21660 | Open | Attempting to fix cross-compile targets | | #21632 | Open | Attempting to fix cross-compile targets | | #21662 | Open | Adding `CMAKE_SYSTEM_PROCESSOR` to ARM64 cross-compile presets | | #21653 | Open | Attempting to skip auto-detection when cross-compiling | | #21655 | Open | Attempting to skip auto-detection for cross-compilation targets | This PR supersedes the still-open PRs above by addressing the root cause: `-march` via cmake doesn't work with zig on ARM. The zig `-target` mechanism is the correct approach.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Fixes CI failure on merge-train/spartan caused by
-march=skylakebeing injected into aarch64 cross-compilation builds (arm64-android, arm64-ios, arm64-macos).Root cause: The
arch.cmakeauto-detection added in #21611 defaultsTARGET_ARCHtoskylakewhenARMis not detected. Cross-compile presets (ios, android) don't setCMAKE_SYSTEM_PROCESSOR, so ARM detection fails and-march=skylakegets passed to aarch64 Zig builds — which errors withunknown CPU: 'skylake'. For arm64-macos,-march=genericoverrides Zig's-mcpu=apple_a14, breaking libdeflate.Fix: Gate auto-detection on
NOT CMAKE_CROSSCOMPILING. Cross-compile toolchains handle architecture targeting via their own flags (e.g. Zig-mcpu). Presets that explicitly setTARGET_ARCH(amd64-linux, arm64-linux) are unaffected.Also restores
native_build_dirvariable dropped in the build infrastructure refactor.Test plan
-marchflags-marchvalues